#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/timerfd.h>1
int main()
{
    //CLOCK_REALTIME 以系统时间为基础，例如现在的时间为9:08,设置两分钟超时，那么到9:10就超时了，但是如果系统时间发生改变就会产生严重问题。
    //CLOCK_MONOTONIC 以系统启动的时间为基准，就算系统时间改变也不影响
    //flags = 0，设置为0就可以了。代表阻塞操作
    //返回的是一个文件描述符，每隔一个超时时间，系统往里面写入一个数字，8字节，这个数字表示距离上一次读取文件时，超时了多少次
    int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
    if (timerfd < 0)
    {
        perror("timerfd create error");
        return -1;
    }
    struct itimerspec itmes;
    itmes.it_value.tv_sec = 1;
    itmes.it_value.tv_nsec = 0; //设置第一个超时时间为多少，这里设置为1秒
    itmes.it_interval.tv_sec = 1;
    itmes.it_interval.tv_nsec = 0; //经过第一个超时时间后，多长时间超时一次，这里还是设置一秒
    timerfd_settime(timerfd,0,&itmes,NULL);
    //int __ufd, int __flags, const itimerspec *__utmr, itimerspec *__otmr
    //_ufd: 上面create的文件fd
    //_flags : 表示相对时间，以一个时间为基准，算我超时的时间是多少
    //_utmr: 我们设置进去的超时规则
    //_otmr: 历史的超时时间
    while(1)
    {
        uint64_t times;
        int n = ::read(timerfd,&times,sizeof(times));
        if (n< 0)
        {
            perror("read error");
            return -1;
        }
        printf("距离上一次超时过了超时了: %ld次\n",times);
    }
    return 0;
}